;	Tested and working
;	There is an issue beyond the scope of this hack marked by
;	"WARNING" below

;	Tribal State Hack
;	Already defined in cheat list file
;.equ				TRAINER_OFFSET,

;	Already defined in "Co-Op Mode Save and Load Hack.txt"
;.equ				TRIBAL_CACHE,

.long				0xD2048180
LHU	A3,	0x00DC	(A1)	;Original instruction
.long				0x82048180
LHU	A3,	0x005C	(A1)	;Load saved tribal bits instead of killed tribal bits
.align				3
.long				0xE0000000
.long				0x00000000

.long				0xD20481E8
SH	T2,	0x00DC	(A1)	;Original instruction
.long				0x820481E8
SH	T2,	0x005C	(A1)	;Write to saved tribal bits instead of killed tribal bits
.align				3
.long				0xE0000000
.long				0x00000000

;	Tribal state rewarp
;	Begin C0DE segment
.long				0xC0DE0000
.long				0x00000000

LUI	S0,	%hi(0x80001AA0 + TRAINER_OFFSET)		;
LHU	S0,	%lo(0x80001AA0 + TRAINER_OFFSET)	(S0)	;
				;[lastLocation]
BEQZ	S0,			TSR_Exit
NOP				;Don't allow loading of tribal state if no such state
				;ever existed

LUI	S0,	%hi(0x80000000 + TRAINER_OFFSET)		;
LW	S0,	%lo(0x80001AC0 + TRAINER_OFFSET)	(S0)	;
				;[warpingDone]
LUI	S1,	0xDEAD		;
ORI	S1,	S1,	0xBEEF	;Warping done?
BNE	S0,	S1,		TSR_Exit
NOP

LUI	S0,	%hi(0x80000000 + TRAINER_OFFSET)		;
LHU	S0,	%lo(0x80001A9E + TRAINER_OFFSET)	(S0)	;
				;[tribalDataLoadState]
BEQZ	S0,			TSR_Check_For_Clear
ORI	S1,	R0,	0x0001	;
BEQ	S0,	S1,		TSR_Check_For_L
NOP
BEQZ	R0,			TSR_Exit
NOP

				TSR_Check_For_Clear:
LUI	S0,	0x8010		;
LH	S0,	0x5304	(S0)	;
BNEZ	S0,			TSR_Exit
NOP
ORI	S1,	R0,	0x0001	;TSR_Check_For_L
LUI	S0,	%hi(0x80000000 + TRAINER_OFFSET)		;
SH	S1,	%lo(0x80001A9E + TRAINER_OFFSET)	(S0)	;
				;[tribalDataLoadState]
BEQZ	R0,			TSR_Exit
NOP

				TSR_Check_For_L:
LUI	S0,	0x8010		;
LH	S0,	0x5304	(S0)	;
ORI	S1,	R0,	0x0020	;L's value
BNE	S0,	S1,		TSR_Not_L
NOP

LUI	S0,	%hi(0x80001A9C + TRAINER_OFFSET)		;
LH	S0,	%lo(0x80001A9C + TRAINER_OFFSET)	(S0)	;
				;[gameActive]
ORI	S1,	R0,	0x0001	;
BNE	S0,	S1,		TSR_Exit
NOP

ORI	S1,	R0,	0x0002	;Load tribal data
LUI	S0,	%hi(0x80000000 + TRAINER_OFFSET)		;
SH	S1,	%lo(0x80001A9E + TRAINER_OFFSET)	(S0)	;
				;[tribalDataLoadState]
LHU	S1,	%lo(0x80001AA0 + TRAINER_OFFSET)	(S0)	;
				;[lastLocation]
LUI	S0,	%hi(0x800A3250)	;
SH	S1,	%lo(0x800A3250)	(S0)	;
				;warpLocation = lastLocation
ORI	S1,	R0,	0x0001	;
SB	S1,	%lo(0x800A3294)	(S0)	;
				;doWarp == true
BEQZ	R0,			TSR_Exit
NOP

				TSR_Not_L:
BEQZ	S0,			TSR_Exit
NOP
ORI	S1,	R0,	0x0003	;Don't load tribal data
LUI	S0,	%hi(0x80000000 + TRAINER_OFFSET)		;
SH	S1,	%lo(0x80001A9E + TRAINER_OFFSET)	(S0)	;

				TSR_Exit:
JR	RA			;
NOP

.align				3
.long				0xE0000000
.long				0x00000000
;	End C0DE segment

;	Keep saved tribals hack
;	If 0x80048650 == (instruction that's usually there)
;	Do 0x87 code type for skipping resetting of tribal data
;	if tribalDataLoadState == 2 && region == lastRegion,
;	else if tribalDataLoadState == 2 tribalDataLoadState = 3
.long				0xD2048650
SH	R0,	0x005C	(T7)	;Original code
.long				0x87048650
.long				0x00000000
;	T8 and T9 are free
LUI	T8,	%hi(0x80001A9E + TRAINER_OFFSET)		;
LHU	T9,	%lo(0x80001A9E + TRAINER_OFFSET)	(T8)	;
				;[tribalDataLoadState]
ORI	T8,	R0,	0x0002	;
BNE	T8,	T9,		KSTH_Normal_Return
NOP

ADDIU	SP,	SP,	-0x0008	;Stack stuff
SW	S0,	0x0000	(SP)	;""
SW	S1,	0x0004	(SP)	;""

LUI	T8,	%hi(0x800A323C)	;
LHU	T8,	%lo(0x800A323C)	(T8)	;
ORI	T9,	R0,	0x0118	;Size of room data at 0x00CB3100
MFHI	S0			;
MFLO	S1			;
MULTU	T8,	T9		;
MFLO	T8			;
MTHI	S0			;
MTLO	S1			;
LUI	T9,	%hi(0xB0CB3100)	;
ORI	T9,	T9,	%lo(0xB0CB3100)	;
ADDU	T8,	T8,	T9	;
LBU	S0,	0x0102	(T8)	;[region]
LUI	T8,	%hi(0x80000000 + TRAINER_OFFSET)		;
LBU	T9,	%lo(0x80001AA2 + TRAINER_OFFSET)	(T8)	;
				;[lastRegion]
BEQ	S0,	T9,		KSTH_Return
NOP				;region == lastRegion?
ORI	T9,	R0,	0x0003	;
SH	T9,	%lo(0x80001A9E + TRAINER_OFFSET)	(T8)	;
				;tribalDataLoadState = 3
SH	R0,	0x005C	(T7)	;Original code

				KSTH_Return:
LW	S0,	0x0000	(SP)	;Stack stuff
LW	S1,	0x0004	(SP)	;""
ADDIU	SP,	SP,	0x0008	;""
J				0x00048654
NOP

				KSTH_Normal_Return:
J				0x00048654
SH	R0,	0x005C	(T7)	;Original code
.align				3
.long				0xE0000000
.long				0x00000000
.long				0xE0000000
.long				0x00000000

.long				0xD204866C
SH	R0,	0x00DC	(T9)	;
.long				0x8204866C
NOP				;Now cut that out!
.align				3
.long				0xE0000000
.long				0x00000000

;	Keep saved count hack
;	If 0x80048678 == (instruction that's usually there)
;	Do 0x87 code type for keeping saved tribal count if
;	tribalDataLoadState == 2
.long				0xD2048678
SB	R0,	0x0004	(T0)	;Original code
.long				0x87048678
.long				0x00000000
;	T1 and T3 are free
LUI	T1,	%hi(0x80001A9E + TRAINER_OFFSET)		;
LHU	T1,	%lo(0x80001A9E + TRAINER_OFFSET)	(T1)	;
				;[tribalDataLoadState]
ORI	T3,	R0,	0x0002	;
BNEL	T1,	T3,		KSCH_Return
SB	R0,	0x0004	(T0)	;Original code
				KSCH_Return:
J				0x0004867C
NOP
.align				3
.long				0xE0000000
.long				0x00000000
.long				0xE0000000
.long				0x00000000

;	Keep killed count hack
;	If 0x80048684 == (instruction that's usually there)
;	Do 0x87 code type for keeping killed tribal count if
;	tribalDataLoadState == 2
.long				0xD2048684
SB	R0,	0x0005	(T1)	;Original code
.long				0x87048684
.long				0x00000000
;	T2 and T3 are free
LUI	T2,	%hi(0x80001A9E + TRAINER_OFFSET)		;
LHU	T2,	%lo(0x80001A9E + TRAINER_OFFSET)	(T2)	;
				;[tribalDataLoadState]
ORI	T3,	R0,	0x0002	;
BNEL	T2,	T3,		KKCH_Return
SB	R0,	0x0005	(T1)	;Original code
				KKCH_Return:
J				0x00048688
NOP
.align				3
.long				0xE0000000
.long				0x00000000
.long				0xE0000000
.long				0x00000000

;	WARNING: Saving in Gem Quarry after killing the first two tribals
;	and then loading the Gem Quarry again with tribal data kept
;	caused the value for missing tribals to be left as 0xFE, not
;	0x03; this is because the missing tribal count isn't properly
;	initialized in multiplayer/co-op
;	Keep missing count hack
;	If 0x800486A0 == (instruction that's usually there)
;	Do 0x87 code type for keeping missing tribal count if
;	tribalDataLoadState == 2
.long				0xD20486A0
SB	T5,	0x0006	(T6)	;Original code
.long				0x870486A0
.long				0x00000000
;	A0 and T7 are free
LUI	A0,	%hi(0x80001A9E + TRAINER_OFFSET)		;
LHU	A0,	%lo(0x80001A9E + TRAINER_OFFSET)	(A0)	;
				;[tribalDataLoadState]
ORI	T7,	R0,	0x0002	;
BNEL	A0,	T7,		KMCH_Return
SB	T5,	0x0006	(T6)	;Original code
				KMCH_Return:
J				0x000486A4
NOP
.align				3
.long				0xE0000000
.long				0x00000000
.long				0xE0000000
.long				0x00000000
;	End of Tribal State Hack
